<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <script>
      function createTextVNode(){
           return 'createTextVNode'
      }
      /**
       * Check if value is primitive
       *  //判断数据类型是否是string，number，symbol，boolean
       */
      function isPrimitive(value) {
          //判断数据类型是否是string，number，symbol，boolean
          return (
                  typeof value === 'string' ||
                  typeof value === 'number' ||
                  // $flow-disable-line
                  typeof value === 'symbol' ||
                  typeof value === 'boolean'
          )
      }
      //判断数据 是否是undefined或者null
      function isUndef(v) {
          return v === undefined || v === null
      }

      //判断是否是文本节点
      function isTextNode(node) {
          return isDef(node) && isDef(node.text) && isFalse(node.isComment)
      }
      //判断数据 是否不等于 undefined或者null
      function isDef(v) {
          return v !== undefined && v !== null
      }
      //判断是否真的等于true
      function isTrue(v) {
          return v === true
      }
      function normalizeArrayChildren(
              children,
              nestedIndex
      ) {
          var res = [];
          var i, c, lastIndex, last;
          console.log(nestedIndex)
          debugger;

          for (i = 0; i < children.length; i++) {  //循环数组子节点children
              c = children[i];
              //判断是否是空 并且 c是一个布尔值的时候
              if (isUndef(c) || typeof c === 'boolean') {
                  continue
              }
              // 获取  res 数组的长度
              lastIndex = res.length - 1;
              //获取res 最后一个数据
              last = res[lastIndex];
              //  nested
              if (Array.isArray(c)) { //如果c 子节点还是一个数组
                                      if (c.length > 0) { //并且 长度 不为0
                                          //数组则用递归   nestedIndex 有可能是 0_0  0_0_0 0_0_1 0_0_2  0_1  0_1_0 0_1_1 0_1_2
                                          //如果含有子节点，则递归，把所有子节点变成文本节点
                                          c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
                                          // merge adjacent text nodes 合并相邻文本节点
                                          //如果c[0] 中的第一个是文本节点 并且 res 最后一个节点是 文本节点
                                          if (isTextNode(c[0]) && isTextNode(last)) {
                                              //创建一个文本节点 并且是合并他们的文本内容
                                              res[lastIndex] = createTextVNode(last.text + (c[0]).text);
                                              //从c 出栈第一个数据
                                              c.shift();
                                          }
                                          //res 添加 数据 相当于 concat 链接数组
                                          res.push.apply(res, c);
                                      }
              } else if (isPrimitive(c)) {  //判断数据类型是否是string，number，symbol，boolean
                                      //如果res最后数据一个是文本节点
                                      if (isTextNode(last)) {
                                          // merge adjacent text nodes 合并相邻文本节点
                                          // this is necessary for SSR hydration because text nodes are 这对于SSR水化是必要的，因为文本节点是
                                          // essentially merged when rendered to HTML strings 当呈现到HTML字符串时本质上合并
                                          // 创建文本节点
                                          res[lastIndex] = createTextVNode(last.text + c);
                                      } else if (c !== '') { //c不等于空
                                          // convert primitive to vnode
                                          //转换成 vnode  创建 文本节点
                                          res.push(createTextVNode(c));
                                      }
              } else {
                                          //如果c  中的第一个是文本节点 并且 res 最后一个节点是 文本节点
                                          if (isTextNode(c) && isTextNode(last)) {
                                              // merge adjacent text nodes 合并相邻文本节点
                                              //创建文本节点
                                              res[lastIndex] = createTextVNode(last.text + c.text);
                                          } else {
                                              // default key for nested array children (likely generated by v-for)
                                              //嵌套数组子的默认键 可能v-for产生的

                                              if (
                                                      isTrue(children._isVList) && //如果children._isVList 为true
                                                      isDef(c.tag) &&   //c.tag 不为空
                                                      isUndef(c.key) && //c.key 为空的时候
                                                      isDef(nestedIndex)) { //nestedIndex不为空
                                                  //赋值key的值为__vlist+1+"_" + 1 + "__";
                                                  c.key = "__vlist" + nestedIndex + "_" + i + "__";
                                              }
                                              //把VNode 添加到res 中
                                              res.push(c);
                                          }
              }
          }
//          console.log(res)
//          debugger;
          //返回 res 值
          return res
      }

      console.log(normalizeArrayChildren(
         [
          {
                _isVList:true,
                tag:'div',
                key:'1',
                nestedIndex:2,
           },
          {
              _isVList:true,
              tag:'span',
              key:'2',
              nestedIndex:2,
          },
          [
                {
                    _isVList:true,
                    tag:'span',
                    key:'3',
                    nestedIndex:3,
                }
          ],
            {
            _isVList:true,
            tag:'span',
            key:'4',
            nestedIndex:4,
            },
            {
                _isVList:true,
                tag:'span',
                key:'5',
                nestedIndex:5,
            },
            {
                _isVList:true,
                tag:'span',
                key:'6',
                nestedIndex:6,
            },
           {
                _isVList:true,
                tag:'span',
                key:'7',
                nestedIndex:7,
            },
            [
             {
            _isVList:true,
            tag:'span',
            key:'8',
            nestedIndex:8,
            }
            ],
             [
                 [{
                     _isVList:true,
                     tag:'span',
                     key:'9',
                     nestedIndex:9,
                 }]
             ]
         ]
       ))
  </script>
</body>
</html>